/*
 * @(#) EntityUtility.java 2010-9-15
 *
 * Copyright (c) 2010, Strong Technology. All Rights Reserved.
 * Strong Technology. CONFIDENTIAL
 */
package cn.strong.gweva.common.util;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.beanutils.BeanMap;

import cn.strong.gweva.common.business.entity.BaseEntity;
import cn.strong.gweva.common.business.entity.db.DBBaseEntity;

/**
 * Entity处理类
 * 
 * @author lilanfei
 * @version 1.0
 * @since 2010-9-15
 */
public class EntityUtility
{

	/**
	 * @param src 源Entity
	 * @param dest 目标Entity
	 */
	@SuppressWarnings("unchecked")
	public static void copyDBEntity(DBBaseEntity src, DBBaseEntity dest)
	{
		BeanMap destMap = new BeanMap(dest);

		BeanMap srcMap = new BeanMap(src);

		Iterator iterator = srcMap.keyIterator();

		while (iterator.hasNext())
		{
			String key = (String)iterator.next();
			if (srcMap.containsKey(key) && destMap.containsKey(key) && !("class".equals(key))
					&& !("value".equals(key)))
			{
				Object value = srcMap.get(key);
				destMap.put(key, value);
			}
		}
	}

	/**
	 * @param src 源Entity
	 * @param dest 目标Entity
	 */
	@SuppressWarnings("unchecked")
	public static void copyEntity(Object src, Object dest)
	{
		BeanMap destMap = new BeanMap(dest);

		BeanMap srcMap = new BeanMap(src);

		Iterator iterator = srcMap.keyIterator();

		while (iterator.hasNext())
		{
			String key = (String)iterator.next();
			if (srcMap.containsKey(key) && destMap.containsKey(key) && !("class".equals(key)))
			{
				Object value = srcMap.get(key);
				if (value instanceof BaseEntity)
				{
					destMap.put(key, value);
				}
				else
				{
					destMap.put(key, value);
				}
			}
		}
	}

	/**
	 * @param src 源Entity
	 * @param dest 目标Entity
	 * @param column 属性
	 */
	public static void copyEntityByColumn(BaseEntity src, BaseEntity dest, String column)
	{
		BeanMap destMap = new BeanMap(dest);

		BeanMap srcMap = new BeanMap(src);

		if (destMap.containsKey(column) && srcMap.containsKey(column))
		{
			srcMap.put(column, destMap.get(column));
		}

	}

	/**
	 * @param entity BaseEntity
	 * @param itemName
	 */
	public static void clearEnityByColumn(BaseEntity entity, String[] itemName)
	{
		if (entity == null)
		{
			return;
		}

		BeanMap entityMap = new BeanMap(entity);
		for (int i = 0; i < itemName.length; i++)
		{
			String key = itemName[i];
			if (entityMap.containsKey(key))
			{
				entityMap.put(key, null);
			}
		}
	}

	/**
	 * 比较对象是否相等
	 * 
	 * @param src1 Object
	 * @param src2 Object
	 * @return src1.equals(src2)
	 */
	@SuppressWarnings("unchecked")
	public static boolean equals(Object src1, Object src2)
	{
		if (!src1.getClass().equals(src2.getClass()))
		{
			return false;
		}
		if (src1 == src2)
		{
			return true;
		}
		BeanMap src1Map = new BeanMap(src1);

		BeanMap src2Map = new BeanMap(src2);

		Iterator iterator1 = src1Map.keyIterator();
		while (iterator1.hasNext())
		{
			String key = (String)iterator1.next();
			if (src1Map.containsKey(key) && !("class".equals(key)))
			{
				Object value1 = src1Map.get(key);
				Object value2 = src2Map.get(key);
				if (value1 == value2)
				{
					continue;
				}
				if (List.class.equals(src1Map.getType(key)))
				{
					List list1 = (List)value1;
					List list2 = (List)value2;
					if (!(list1 == null ? list2 == null : equalsList(list1, list2)))
					{
						return false;
					}
				}
				else if (!(value1 == null ? (value2 == null || "".equals(value2)) : value1
						.equals(value2)))
				{
					return false;
				}
			}
		}
		return true;
	}

	/**
	 * 比较List是否相等
	 * 
	 * @param list1 List
	 * @param list2 List
	 */
	@SuppressWarnings("unchecked")
	public static boolean equalsList(List list1, List list2)
	{
		if (list2 == null)
		{
			return false;
		}
		if (list1 == list2)
		{
			return true;
		}
		if (list1 == null || list1.size() != list2.size())
		{
			return false;
		}
		for (int j = 0; j < list2.size(); j++)
		{
			Object value1 = list1.get(j);
			if (value1 == null)
			{
				continue;
			}
			int i = 0;
			for (; i < list2.size(); i++)
			{
				Object value2 = list2.get(i);
				if ((value1 == null ? (value2 == null || "".equals(value2)) : value1.equals(value2)))
				{
					break;
				}
			}

			if (i == list2.size())
			{
				return false;
			}
		}

		return true;
	}

//	/**
//	 * Entity中所有DbEntity的共同项目设定
//	 * @param user LoginUserEntity
//	 * @param entity 需要设定的Entity
//	 * @param isInsert 是否是插入操作。插入：true，其他：false
//	 */
//	@SuppressWarnings("unchecked")
//	public static void setDbCommonField(DipsUserEntity user, BaseEntity entity, boolean isInsert)
//	{
//		Date now = DateUtil.getSysDate();
//		String uuid = StringUtil.getUUID();
//
//		BeanMap srcMap = new BeanMap(entity);
//		Iterator iterator = srcMap.keyIterator();
//		if (entity instanceof DBBaseEntity)
//		{
//			DBBaseEntity dbEntity = (DBBaseEntity)entity;
//			if (isInsert)
//			{
//				dbEntity.setCreateUserId(user.getUserId());
//				dbEntity.setCreateTime(now);
//				if (StringUtil.isEmpty(dbEntity.getExclusivekey()))
//				{
//					dbEntity.setExclusivekey(uuid);
//				}
//			}
//			dbEntity.setExclusivekey4Update(uuid);
//			dbEntity.setUpdateTime(now);
//			dbEntity.setUpdateUserId(user.getUserId());
//		}
//		while (iterator.hasNext())
//		{
//			String key = (String)iterator.next();
//			if (srcMap.containsKey(key) && !("class".equals(key)))
//			{
//				Object member = srcMap.get(key);
//
//				if (member instanceof DBBaseEntity)
//				{
//					DBBaseEntity dbEntity = (DBBaseEntity)member;
//					if (isInsert)
//					{
//						if (dbEntity.getCreateUserId() == null)
//						{
//							dbEntity.setCreateUserId(user.getUserId());
//						}
//						if (dbEntity.getCreateTime() == null)
//						{
//							dbEntity.setCreateTime(now);
//						}
//						if (StringUtil.isEmpty(dbEntity.getExclusivekey()))
//						{
//							dbEntity.setExclusivekey(uuid);
//						}
//					}
//					dbEntity.setExclusivekey4Update(uuid);
//					if (dbEntity.getUpdateTime() == null)
//					{
//						dbEntity.setUpdateTime(now);
//					}
//					if (dbEntity.getUpdateUserId() == null)
//					{
//						dbEntity.setUpdateUserId(user.getUserId());
//					}
//				}
//				else if (member instanceof List)
//				{
//					List lst = (List)member;
//					for (int i = 0; i < lst.size(); i++)
//					{
//						Object lstMember = lst.get(i);
//						if (lstMember instanceof DBBaseEntity)
//						{
//							DBBaseEntity dbEntity = (DBBaseEntity)lstMember;
//							if (isInsert)
//							{
//								if (dbEntity.getCreateUserId() == null)
//								{
//									dbEntity.setCreateUserId(user.getUserId());
//								}
//								if (dbEntity.getCreateTime() == null)
//								{
//									dbEntity.setCreateTime(now);
//								}
//								if (StringUtil.isEmpty(dbEntity.getExclusivekey()))
//								{
//									dbEntity.setExclusivekey(uuid);
//								}
//							}
//							dbEntity.setExclusivekey4Update(uuid);
//							if (dbEntity.getUpdateTime() == null)
//							{
//								dbEntity.setUpdateTime(now);
//							}
//							if (dbEntity.getUpdateUserId() == null)
//							{
//								dbEntity.setUpdateUserId(user.getUserId());
//							}
//						}
//					}
//				}
//			}
//		}
//	}
}
